/*--------------------------------------------------------------------------------------------------
Yatak Operation System Project Copyright 2012-2013
Author : Ilya Churaev
Started : 20 Apr 2012		Updated : 22 Sep 2012
File Name : idt.h			Purpose : initialisate interrupt descriptor tables
--------------------------------------------------------------------------------------------------*/
#ifndef _IDT_H
#define _IDT_H

#ifdef __cplusplus
extern "C" {
#endif

#include <types.h>

// Функция инициализации
void init_idt ();

// Структура, описывающая шлюз прерываний.
struct idt_entry_struct
{
	uint16 base_lo;				// Младшие 16 битов адреса, куда происходи переход в случае возникновения прерывания.
	uint16 sel;					// Переключатель сегмента ядра.
	uint8  always0;				// Это значение всегда должно быть нулевым.
	uint8  flags;				// More flags. See documentation.
	uint16 base_hi;				// Старшие 16 битов адреса, куда происходи переход.
} __attribute__((packed));

typedef struct idt_entry_struct idt_entry_t;

// Структура, описывающая указатель на массив обработчиков прерываний.
// Этот формат подходит для загрузки с помощью 'lidt'.
struct idt_ptr_struct
{
	uint16 limit;
	uint32 base;				// Адрес первого элемента нашего массива idt_entry_t.
} __attribute__((packed));

typedef struct idt_ptr_struct idt_ptr_t;

// Структура, описывающая сегмент состояния задачи Task State Segment.
struct tss_entry_struct
{
    uint32 prev_tss;	// Предыдущий TSS – если используется аппаратное переключение задач, то это поле нужно создания связного списка.
    uint32 esp0;		// Указатель стека, загружаемый при переходе в режим ядра.
    uint32 ss0;			// Сегмент стека, загружаемый при переходе в режим ядра.
    uint32 esp1;		// Не используется ...
    uint32 ss1;
    uint32 esp2;  
    uint32 ss2;   
    uint32 cr3;   
    uint32 eip;   
    uint32 eflags;
    uint32 eax;
    uint32 ecx;
    uint32 edx;
    uint32 ebx;
    uint32 esp;
    uint32 ebp;
    uint32 esi;
    uint32 edi;
    uint32 es;			// Значение, загружаемое в ES при переходе в режим ядра.
    uint32 cs;			// Значение, загружаемое в CS при переходе в режим ядра.
    uint32 ss;			// Значение, загружаемое в SS при переходе в режим ядра.
    uint32 ds;			// Значение, загружаемое в DS при переходе в режим ядра.
    uint32 fs;			// Значение, загружаемое в FS при переходе в режим ядра.
    uint32 gs;			// Значение, загружаемое в GS при переходе в режим ядра.
    uint32 ldt;			// Не используется ...
    uint16 trap;
    uint16 iomap_base;

} __attribute__((packed));

typedef struct tss_entry_struct tss_entry_t;

// These extern directives let us access the addresses of our ASM ISR handlers.
extern void isr0 ();
extern void isr1 ();
extern void isr2 ();
extern void isr3 ();
extern void isr4 ();
extern void isr5 ();
extern void isr6 ();
extern void isr7 ();
extern void isr8 ();
extern void isr9 ();
extern void isr10();
extern void isr11();
extern void isr12();
extern void isr13();
extern void isr14();
extern void isr15();
extern void isr16();
extern void isr17();
extern void isr18();
extern void isr19();
extern void isr20();
extern void isr21();
extern void isr22();
extern void isr23();
extern void isr24();
extern void isr25();
extern void isr26();
extern void isr27();
extern void isr28();
extern void isr29();
extern void isr30();
extern void isr31();
extern void irq0 ();
extern void irq1 ();
extern void irq2 ();
extern void irq3 ();
extern void irq4 ();
extern void irq5 ();
extern void irq6 ();
extern void irq7 ();
extern void irq8 ();
extern void irq9 ();
extern void irq10();
extern void irq11();
extern void irq12();
extern void irq13();
extern void irq14();
extern void irq15();
extern void isr128();

//Syscalls
extern void isr105();
extern void isr85();

#ifdef __cplusplus
}
#endif

#endif
